#include "myc.h"

struct token *pass;
struct type *tsame,*tvoid,*tint,*tchar;
struct var *retvar;
FILE *output;

void adfuncstr(char *str,int spe) {
	int i;
	for (i=0;str[i];i++);
	struct token *tok=splitoken(str,str+i),*end;
	end=tok;
	while (end->next) end=end->next;
	pass=tok;
	add_func(spe);
	freetokens(tok);
}

void init_types() {
	tsame=add_type(strdup("same"),0);
	tvoid=add_type(strdup("void"),0);
	tint=add_type(strdup("int"),2);
	tchar=add_type(strdup("char"),1);
}

void init_funcs() {
	adfuncstr("int opersde(int&)",0);
	adfuncstr("int operude(int&)",0);
	adfuncstr("int opersin(int&)",0);
	adfuncstr("int operuin(int&)",0);
	adfuncstr("int operaad(int&,int)",0);
	adfuncstr("int operasu(int&,int)",0);
	adfuncstr("int operamu(int&,int)",0);
	adfuncstr("int operadi(int&,int)",0);
	adfuncstr("int operamo(int&,int)",0);
	adfuncstr("int operasr(int&,int)",0);
	adfuncstr("int operasl(int&,int)",0);
	adfuncstr("int operadd(int,int)",0);
	adfuncstr("int opersub(int,int)",0);
	adfuncstr("int opermul(int,int)",0);
	adfuncstr("int operdiv(int,int)",0);
	adfuncstr("int opermod(int,int)",0);
	adfuncstr("int opershr(int,int)",0);
	adfuncstr("int opershl(int,int)",0);
	adfuncstr("int operxor(int,int)",0);
	adfuncstr("int operban(int,int)",0);
	adfuncstr("int operbor(int,int)",0);
	adfuncstr("int operaxo(int&,int)",0);
	adfuncstr("int operaan(int&,int)",0);
	adfuncstr("int operaor(int&,int)",0);
	adfuncstr("int operlan(int,int)",2);
	adfuncstr("int operlor(int,int)",2);
	adfuncstr("void* operlan(void*,void*)",2);
	adfuncstr("void* operlor(void*,void*)",2);
	adfuncstr("same opertri(int,same,same)",1);
	adfuncstr("void* opertri(int,void*,void*)",1);
	adfuncstr("same *operadd(same*,int)",5);
	adfuncstr("same *opersub(same*,int)",5);
	adfuncstr("same *operaad(same*&,int)",5);
	adfuncstr("same *operasu(same*&,int)",5);
	adfuncstr("same *operuin(same*&)",5);
	adfuncstr("same *opersin(same*&)",5);
	adfuncstr("same *operude(same*&)",5);
	adfuncstr("same *opersde(same*&)",5);
	adfuncstr("int operequ(char,char)",0);
	adfuncstr("int operequ(int,int)",0);
	adfuncstr("int operequ(void*,void*)",0);
	adfuncstr("int operneq(char,char)",0);
	adfuncstr("int operneq(int,int)",0);
	adfuncstr("int operneq(void*,void*)",0);
	adfuncstr("int opergre(int,int)",0);
	adfuncstr("int opergre(void*,void*)",0);
	adfuncstr("int operegr(int,int)",0);
	adfuncstr("int operegr(void*,void*)",0);
	adfuncstr("int operles(int,int)",0);
	adfuncstr("int operles(void*,void*)",0);
	adfuncstr("int operels(int,int)",0);
	adfuncstr("int operels(void*,void*)",0);
	adfuncstr("same operass(same&,same)",3);
	adfuncstr("same &operure(same*)",4);
	adfuncstr("same *operadr(same&)",7);
	adfuncstr("void operdot(void,int)",6);
	adfuncstr("int operupo(int)",0);
	adfuncstr("int operune(int)",0);
	adfuncstr("int operuln(int)",0);
	adfuncstr("int operubn(int)",0);
}

void init() {
	init_types();
	init_funcs();
	struct token retoken={"",1,NULL,NULL};
	struct vtype retype={tvoid,0,1};
	retvar=add_var(&retoken,retype,PTR_SIZE);
}

void cleanup() {
	freefuncs();
	while (lastvar) del_var();
	freetypes();
}
